

import pandas as pd
import numpy as np


def process_excel_data_with_original_columns(main_excel_path, reference_excel_path=None):
    """
    处理Excel数据，根据指定规则生成新的列，同时保留原有所有列

    参数:
    main_excel_path: 主Excel文件路径
    reference_excel_path: 参考Excel文件路径（用于课程讲类型的content_id映射）
    """

    # 读取主Excel文件
    # df = pd.read_excel(main_excel_path)
    df = pd.read_excel(main_excel_path, sheet_name="高一上 (2)")

    # 如果有参考Excel文件，读取用于映射
    reference_df = None
    if reference_excel_path:
        reference_df = pd.read_excel(reference_excel_path)

    # 创建结果DataFrame（保留原有所有列）
    result_df = df.copy()

    # 1. 生成resource_id
    result_df['resource_id'] = result_df['阶段'].map({
        '高一上': 66,
        '高二上': 67
    })

    # 2. 生成book_id和book_sort
    # 根据"阶段"和"模块名称"聚合去重，保持原Excel中的数据顺序
    # 使用drop_duplicates(keep='first')保持第一次出现的顺序
    unique_books = result_df[['阶段', '模块名称']].drop_duplicates(keep='first').reset_index(drop=True)
    # 不进行排序，保持原始顺序
    unique_books['book_id'] = range(1, len(unique_books) + 1)

    # 将book_id映射回原DataFrame
    result_df = result_df.merge(
        unique_books,
        on=['阶段', '模块名称'],
        how='left'
    )
    result_df['book_sort'] = result_df['book_id']

    # 3. 生成content_id
    def get_content_id(row):
        if row['资源类型'] == 'FM':
            return row['资源id']
        elif row['资源类型'] == '课程讲':
            if reference_df is not None:
                # 从参考Excel中查找对应的最新包id
                match = reference_df[reference_df['lesson_id'] == row['资源id']]
                if not match.empty:
                    return match.iloc[0]['最新的包id']
                else:
                    print(f"警告: 未找到lesson_id {row['资源id']} 对应的最新包id，使用原资源id")
                    return row['资源id']  # 如果找不到，返回原资源id
            else:
                print(f"警告: 未提供参考Excel文件，对于课程讲类型使用原资源id")
                return row['资源id']
        return None

    result_df['content_id'] = result_df.apply(get_content_id, axis=1)

    # 4. 生成content_name
    def get_content_name(row):
        if row['资源类型'] == 'FM':
            return row['资源名称']
        elif row['资源类型'] == '课程讲':
            return ''
        return ''

    result_df['content_name'] = result_df.apply(get_content_name, axis=1)

    # 5. 生成content_sort（递增序号）
    result_df['content_sort'] = range(1, len(result_df) + 1)
    result_df['lesson_sort'] = range(1, len(result_df) + 1)

    # 6. 生成lesson_id
    def get_lesson_id(row):
        if row['资源类型'] == 'FM':
            return 0
        elif row['资源类型'] == '课程讲':
            return row['资源id']
        return 0

    result_df['lesson_id'] = result_df.apply(get_lesson_id, axis=1)

    # 7. 生成lesson_name
    def get_lesson_name(row):
        if row['资源类型'] == 'FM':
            return ''
        elif row['资源类型'] == '课程讲':
            return row['资源名称']
        return ''

    result_df['lesson_name'] = result_df.apply(get_lesson_name, axis=1)

    # 8. 生成content_type
    result_df['content_type'] = result_df['资源类型'].map({
        'FM': 3,
        '课程讲': 1
    })

    # 9. 生成user_type
    result_df['user_type'] = -1

    return result_df


def display_data_summary(df):
    """
    显示数据处理结果摘要
    """
    print("=== 数据处理完成 ===")
    print(f"总行数: {len(df)}")
    print(f"总列数: {len(df.columns)}")

    print("\n=== 新增列统计 ===")
    new_columns = ['resource_id', 'book_id', 'book_sort', 'content_id', 'content_name',
                   'content_sort', 'lesson_id', 'lesson_name', 'content_type', 'user_type']

    for col in new_columns:
        if col in df.columns:
            print(f"{col}: ✓")
        else:
            print(f"{col}: ✗ 缺失")

    print(f"\nresource_id分布:")
    if 'resource_id' in df.columns:
        print(df['resource_id'].value_counts().sort_index())

    print(f"\ncontent_type分布:")
    if 'content_type' in df.columns:
        print(df['content_type'].value_counts().sort_index())

    print(f"\nbook_id分布:")
    if 'book_id' in df.columns:
        print(df['book_id'].value_counts().sort_index())


# 使用示例
def main():
    # 替换为你的Excel文件路径
    # main_excel_path = 'main_data.xlsx'  # 主数据文件
    # reference_excel_path = 'reference_data.xlsx'  # 参考数据文件（可选）

    main_excel_path = 'D:\\project_file\\周末智学新增阶段\\周末“智”学新学期心理资源——高一上&高二上2025.8.14.xlsx'  # 主数据文件
    reference_excel_path = 'D:\\project_file\\周末智学导出资源\\心理课程讲对应的包信息最新.xlsx'  # 参考数据文件（可选）

    try:
        print("开始处理Excel数据...")

        # 处理数据（保留原有所有列）
        result_df = process_excel_data_with_original_columns(main_excel_path, reference_excel_path)

        # 显示处理结果摘要
        display_data_summary(result_df)

        # 显示前几行数据预览
        print("\n=== 数据预览（前3行）===")
        print("原有列:")
        original_cols = ['阶段', '模块名称', '资源类型', '资源id', '资源名称']
        available_original_cols = [col for col in original_cols if col in result_df.columns]
        if available_original_cols:
            print(result_df[available_original_cols].head(3))

        print("\n新增列:")
        new_cols = ['resource_id', 'book_id', 'book_sort', 'content_id', 'content_name',
                    'content_sort', 'lesson_id', 'lesson_name', 'content_type', 'user_type']
        available_new_cols = [col for col in new_cols if col in result_df.columns]
        if available_new_cols:
            print(result_df[available_new_cols].head(3))

        # 保存结果到新的Excel文件
        output_path = 'D:\\pycharmProject\\pythonProject\\xinli_data_inti\\processed_data_with_all_columns_v2.xlsx'
        result_df.to_excel(output_path, index=False)
        print(f"\n✅ 结果已保存到: {output_path}")

        return result_df

    except FileNotFoundError as e:
        print(f"❌ 错误: 找不到Excel文件 - {e}")
        print("请确保文件路径正确，并且文件存在")
        return None
    except KeyError as e:
        print(f"❌ 错误: Excel文件中缺少必需的列 - {e}")
        print("请检查Excel文件是否包含以下列：阶段、模块名称、资源类型、资源id、资源名称")
        return None
    except Exception as e:
        print(f"❌ 处理过程中出现错误: {e}")
        import traceback
        traceback.print_exc()
        return None


# 如果你的Excel文件列名不同，可以使用这个函数先查看列名
def check_excel_columns(excel_path):
    """
    检查Excel文件的列名
    """
    try:
        df = pd.read_excel(excel_path)
        print(f"Excel文件 '{excel_path}' 的列名:")
        for i, col in enumerate(df.columns, 1):
            print(f"{i}. {col}")
        print(f"\n总共 {len(df.columns)} 列，{len(df)} 行数据")
        return df.columns.tolist()
    except Exception as e:
        print(f"读取Excel文件时出错: {e}")
        return None


# 高级使用：自定义列名映射
def process_with_custom_column_mapping(main_excel_path, reference_excel_path=None, column_mapping=None):
    """
    使用自定义列名映射处理数据

    参数:
    column_mapping: 字典，映射标准列名到实际Excel列名
    例如: {'阶段': 'stage', '模块名称': 'module_name', ...}
    """

    if column_mapping is None:
        column_mapping = {}

    # 读取并重命名列
    df = pd.read_excel(main_excel_path)

    # 应用列名映射
    reverse_mapping = {v: k for k, v in column_mapping.items()}
    df = df.rename(columns=reverse_mapping)

    # 保存临时文件
    temp_path = 'temp_renamed.xlsx'
    df.to_excel(temp_path, index=False)

    # 使用标准处理函数
    result = process_excel_data_with_original_columns(temp_path, reference_excel_path)

    # 清理临时文件
    import os
    if os.path.exists(temp_path):
        os.remove(temp_path)

    return result


if __name__ == "__main__":
    # 先检查Excel文件的列名（可选）
    # check_excel_columns('main_data.xlsx')

    # 运行主程序
    main()



if __name__ == "__main__":
    main()

# 如果只有一个Excel文件（没有参考文件），可以这样调用：
# result_df = process_excel_data('main_data.xlsx')

# 如果有参考Excel文件，这样调用：
# result_df = process_excel_data('main_data.xlsx', 'reference_data.xlsx')